8. 模型如何读写数据(Tokenizer 与 Token)

大模型并不能直接理解:

模型真正处理的是:

数字(IDs)

因此:

所有文本都必须先转换成 Token(分词)。


1. 什么是 Token(分词)

模型处理文本的方法通常叫:

Tokenization(分词)

Tokenizer(分词器)会把文本切分成:

然后再映射成:

Token ID(数字编号)


2. 为什么 Tokenizer 很重要

对于 LLM 来说:

Tokenizer 决定了模型如何理解世界。

模型看到的不是:

hello world

而是:

[15496, 995]

这些数字。


3. 词表(Vocabulary)

所有 Token 的集合叫:

Vocabulary(词表)

例如:

每个 Token 都对应一个唯一 ID。

例如:

Token ID
hello 15496
world 995

4. 模型如何处理文本(完整流程)

整个流程如下:

graph LR

A[Text 文本] --> B[Tokenizer 分词器]

B --> C[Tokens Token IDs]

C --> D[LLM 模型]

D --> E[预测下一个 Token]

E --> F[Detokenizer 解码]

F --> G[生成文本]

5. 本质:文字 → 数字 → 概率 → 文字

模型本质上一直在做:

文本
→ Token ID
→ 概率计算
→ 下一个 Token ID
→ 文本

6. 一个完整例子

例如输入:

I love AI

第一步:Tokenizer 分词

可能变成:

["I", " love", " AI"]

第二步:映射成 Token ID

[40, 1842, 9552]

第三步:输入模型

模型开始预测:

下一个 token 是什么?

例如预测:

"!" 的概率最高

第四步:输出 Token

[0]

第五步:解码成文本

最终输出:

I love AI!

7. Tokenization 的问题

Tokenizer 并不总是“符合人类直觉”。


8. Strawberry 为什么数不清 r

经典问题:

strawberry 中有几个 r?

人类很容易知道:

3 个 r

但很多语言模型会答错。


9. 原因:Tokenizer 切分方式

因为模型可能把:

strawberry

切分成:

["straw", "berry"]

模型处理的是:

因此它并不真正“看到”:

r r r

10. 不同 Tokenizer 的差异

不同模型使用不同分词器。

例如:

它们:


示例:空格处理

GPT 系列常见:

" hello"

和:

"hello"

是不同 Token。

因为:

空格本身也是信息。


11. Tokenizer 的核心本质

Tokenizer 本质上是在做:

文本 → 数字映射

即:

word → token id

例如:

单词 Token ID
cat 1024
dog 5321

12. Embedding(嵌入层)

Token ID 还不能直接输入模型。

因为模型只能处理:

向量(Vector)

因此需要:

Embedding Layer(嵌入层)


13. Embedding 的作用

Embedding 会把:

Token ID

转换成:

高维向量

例如:

1024 → [0.12, -0.98, ...]

14. 完整输入流程

graph LR

A[文本 Text]
--> B[Tokenizer]

B --> C[Token IDs]

C --> D[Embedding Layer]

D --> E[向量 Vectors]

E --> F[Transformer LLM]

F --> G[下一个 Token 概率]

15. 模型输出是什么

模型输出的并不是单词。

而是:

整个词表上的概率分布。

例如:

Token 概率
vanilla 0.7
chocolate 0.2
strawberry 0.1

16. Temperature(温度)

Temperature 用于控制:

输出的随机性。


17. 温度低:更确定

例如:

temperature = 0

模型会选择:

概率最高的 Token。


示例

问题:

冰淇淋有什么口味?

模型可能总是回答:

香草味

因为它概率最高。


18. 温度高:更随机

例如:

temperature = 2

模型采样更平均。

可能输出:

并且结果更多样化。


19. Token Sampling(采样)

模型预测完概率后,

需要一种方法:

从概率分布中选出下一个 Token。


20. Beam Search(束搜索)

Beam Search 是一种经典解码算法。

它会:

同时保留多个高概率候选路径。

而不是只选一个。


简化理解

不是:

只走一条路

而是:

同时探索多条可能路径

最后选择整体概率最高的句子。


21. Batch 与 Padding

训练时通常不是一次只输入一句话。

而是:

Batch(批量训练)

例如:

句子1:I love AI
句子2:Hello

22. 问题:长度不同

模型要求:

同一个 Batch 长度一致。

因此需要:

Padding(填充)


23. Padding 示例

例如:

句子1:
[I, love, AI]

句子2:
[Hello]

Padding 后:

[I, love, AI]
[Hello, PAD, PAD]

这样长度统一:

长度 = 3

24. Padding Token 的作用

PAD Token 本身:

训练时通常会:

Mask 掉 PAD 的损失计算。


25. 如何加载 Tokenizer

通常使用:

HuggingFace Transformers


示例代码

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained(model_name)

26. 不同模型 Tokenizer 不兼容

例如:

它们:

因此:

Tokenizer 和模型必须配套使用。


27. Tokenizer 是否需要重新训练

通常情况下:

后训练不会修改 Tokenizer。

因为:

因此:

大多数 SFT / RL 都直接复用原词表。


28. 什么情况下需要修改词表

如果进入专业领域:

例如:

可能存在大量:

这时可能需要:

扩展 Vocabulary(词表)。


29. 修改词表的影响

词表变化后:

Embedding Layer 也必须同步扩展。

因为:

Embedding 大小
=
Vocabulary Size

例如:

50,000 tokens
→ embedding matrix:
[50000 × hidden_size]

如果新增 Token:

50,100 tokens

Embedding 层也必须变成:

[50100 × hidden_size]

30. 一句话总结

Tokenizer:

决定模型如何理解文本。

Embedding:

把 Token 转换成向量。

LLM:

在 Token 概率空间中预测下一个 Token。

最终:

大模型本质上只是一个“预测下一个 Token 的概率机器”。